home *** CD-ROM | disk | FTP | other *** search
/ The 640 MEG Shareware Studio 2 / The 640 Meg Shareware Studio CD-ROM Volume II (Data Express)(1993).ISO / pascal / pibasy47.zip / FDELAY.ASM < prev    next >
Assembly Source File  |  1987-11-11  |  2KB  |  55 lines

  1. ;
  2.           XOR    AX,AX                 ;Clear AX to zero
  3.           MOV    ES,AX                 ;Allow low-memory access
  4. ;
  5.           MOV    WORD [>OutCount],0    ;Clear outer loop counter
  6. ;
  7.           CLI                          ;No interrupts while reading
  8.       ES: MOV    CX,[>$46E]            ;Hi part of CPU timer value
  9.       ES: MOV    DX,[>$46C]            ;Lo part of CPU timer value
  10.           STI                          ;Interrupts back on
  11. ;
  12.           MOV    [>Hi_Timer],CX        ;Save hi part of timer
  13.           MOV    [>Lo_Timer],DX        ;Save low part of timer
  14. ;
  15. Loop1:    CLI                          ;No interrupts while reading
  16. ;
  17.       ES: MOV    CX,[>$46E]            ;Hi part of CPU timer value
  18.       ES: MOV    DX,[>$46C]            ;Lo part of CPU timer value
  19. ;
  20.           STI                          ;Interrupts back on
  21. ;
  22.           MOV    AX,CX                 ;Save CX and DX for later
  23.           MOV    BX,DX
  24. ;
  25.           SUB    AX,[>Hi_Timer]        ;Subtract low order part
  26.           SBB    BX,[>Lo_Timer]        ;Subtract high order part
  27. ;
  28.           JE     Loop1                 ;Continue until non-0 tick difference
  29. ;
  30.           MOV    [>Hi_Timer],CX        ;Save hi part
  31.           MOV    [>Lo_Timer],DX        ;Save low part
  32. ;
  33. Loop2:    MOV    CX,110                ;Run short delay loop.
  34. Delay:    LOOP   Delay
  35. ;
  36.           CLI                          ;No interrupts while reading
  37. ;
  38.       ES: MOV    CX,[>$46E]            ;Hi part of CPU timer value
  39.       ES: MOV    DX,[>$46C]            ;Lo part of CPU timer value
  40. ;
  41.           STI                          ;Interrupts back on
  42. ;
  43.           INC    WORD [>OutCount]      ;Increment outer loop count
  44. ;
  45.           SUB    CX,[>Hi_Timer]        ;Subtract low order part
  46.           SBB    DX,[>Lo_Timer]        ;Subtract high order part
  47. ;
  48.           JE     Loop2                 ;Keep going if next tick not found
  49. ;
  50.           MOV    AX,[>OutCount]        ;Pick up outer loop counter
  51.           SHL    AX,1                  ;* 2 = ticks for 1 ms delay
  52. ;
  53.           LES    DI,[BP+>One_MS_Delay] ;Get address of result
  54.       ES: MOV    [DI],AX               ;Store result
  55.